#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Mikan アプリケーション パッケージ

Mikan Python Web Framework
"""

__author__ = "K.Sonohara"
__status__ = "develop"
__version__ = "0.0.0_7"
__date__    = "2013/02/24"
__license__ = 'LGPL'

# ------------------------------------------------------------
## インポート
# ------------------------------------------------------------
# Python
import traceback

# XML
from xml.dom import minidom
from xml.dom.minidom import getDOMImplementation

# ESiPC
from esipc import ESiPCProperty

# Mikan
from mikan.view import MikanFileView
from mikan.core import AbstractMikanPerform, MIKAN_CONTENT_TYPE, MIKAN_HTTP_HEADER, MIKAN_INI, MIKAN, MIKAN_HTTP_STATUS
from mikan.exception import AbstractMikanException, AbstractMikanStatusException, MikanStatusException
from mikan.util import string_compress

# ------------------------------------------------------------
## 変数
# ------------------------------------------------------------

# ------------------------------------------------------------
## 関数
# ------------------------------------------------------------

# ------------------------------------------------------------
## クラス
# ------------------------------------------------------------

# ------------------------------------------------------------
## Mikan アプリケーション クラス
#
class MikanApp(AbstractMikanPerform):

	# ----------------------------------------------------
	## コンフィグサフィックスゲッター
	# @return 取得した値
	def get_config_suffix(self):
		return self.FConfigSuffix

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	def __init__(self, request, configsuffix=""):
		super(MikanApp, self).__init__(request)
		self.FConfigSuffix = configsuffix

		# 値設定
		request.configsuffix = self.configsuffix

	# ----------------------------------------------------
	## Property
	configsuffix = ESiPCProperty(get_config_suffix, None, None)

# ------------------------------------------------------------
## Mikan アクション アプリケーション クラス
#
class MikanAuthApp(MikanApp):

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	def __init__(self, request, auth=None, configsuffix=""):
		# 継承元実行
		super(MikanAuthApp, self).__init__(request, configsuffix=configsuffix)

		# 値の設定
		self.FAuth = auth

	# ----------------------------------------------------
	## アクション フィールドゲッター
	# @param value 取得した値
	def set_auth(self, value):
		self.FAuth = value

	# ----------------------------------------------------
	## アクション フィールドゲッター
	# @return 取得した値
	def get_auth(self):
		return self.FAuth

	# ----------------------------------------------------
	## 処理
	# @return Trueなら続行
	def prepare(self):
		# 継承元処理
		if not super(MikanAuthApp, self).prepare():
			# ログ
			if self.islogdebug:
				self.logger.debug(False)
			return False

		# アクションが設定されている場合実行
		if (self.auth != None):
			# アクション処理
			if self.auth.prepare():
				# アクション処理
				return self.auth.perform()

		# 処理結果
		return True

	# ----------------------------------------------------
	## Property
	auth = ESiPCProperty(get_auth, set_auth, None)

# ------------------------------------------------------------
## Mikan アクション アプリケーション クラス
#
class MikanActionApp(MikanAuthApp):

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	def __init__(self, request, configsuffix=""):
		# 継承元実行
		super(MikanActionApp, self).__init__(request, configsuffix=configsuffix)

		# 値の設定
		self.FAction = None

	# ----------------------------------------------------
	## アクション フィールドゲッター
	# @param value 取得した値
	def set_action(self, value):
		self.FAction = value

	# ----------------------------------------------------
	## アクション フィールドゲッター
	# @return 取得した値
	def get_action(self):
		return self.FAction

	# ----------------------------------------------------
	## 処理
	# @return Trueなら続行
	def prepare(self):
		# 継承元処理
		if not super(MikanActionApp, self).prepare():
			# ログ
			if self.islogdebug:
				self.logger.debug(False)
			return False

		# アクションが設定されている場合実行
		if (self.action != None):
			# アクション処理
			if self.action.prepare():
				# アクション処理
				return self.action.perform()

		# 処理結果
		return True

	# ----------------------------------------------------
	## Property
	action = ESiPCProperty(get_action, set_action, None)

# ------------------------------------------------------------
## Mikan ビュー アプリケーション クラス
#
class MikanViewApp(MikanActionApp):

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	#  @param view ビュー
	def __init__(self, request, view=None, configsuffix=""):
		# 継承元処理
		super(MikanViewApp, self).__init__(request, configsuffix=configsuffix)

		# 値の設定
		self.FView = view

	# ----------------------------------------------------
	## ビュー フィールドセッター
	# @param value 設定する値
	def set_view(self, value):
		self.FView = value

	# ----------------------------------------------------
	## ビュー フィールドゲッター
	# @return 取得した値
	def get_view(self):
		return self.FView

	# ----------------------------------------------------
	## 処理
	# @return Trueなら続行
	def perform(self):
		# 継承元処理
		if not super(MikanViewApp, self).perform():
			# ログ
			if self.islogdebug:
				self.logger.debug(False)
			return False

		# ビューが設定されている場合実行
		if (self.view != None):
			# ビュー処理
			if self.view.perform():
				# エンコード利用設定
				self.request.useencode = self.view.isencode

				# Content Type
				self.request.contenttype = self.view.contenttype

				# Content Length
#				if self.view.contentlength:
#					self.request.headers[MIKAN_HTTP_HEADER.NAME_CONTENT_LENGTH] = str(self.view.contentlength)
#					if self.islogdebug:
#						self.logger.debug(self.view.contentlength)

				# Content
				content = self.view.content

				# Content Deflate
				if self.islogdebug:
					self.logger.debug(self.view.isdeflate)
				if content and self.view.isdeflate:
					try:
						content = string_compress(content)

						# HTTPヘッダーに設定
						self.request.headers[MIKAN_HTTP_HEADER.NAME_CONTENT_ENCODING] = str(MIKAN_HTTP_HEADER.VALUE_CONTENT_ENCODING)
						self.request.headers[MIKAN_HTTP_HEADER.NAME_VARY] = str(MIKAN_HTTP_HEADER.VALUE_VARY)
					except:
						if self.islogdebug:
							self.logger.debug(traceback.format_exc())

				# Content
				self.request.content = content
		# 処理結果
		return True

	# ----------------------------------------------------
	## Property
	view = ESiPCProperty(get_view, set_view, None)

# ------------------------------------------------------------
## Mikan ビュー アプリケーション クラス
#
class MikanAdminViewApp(MikanViewApp):

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	#  @param view ビュー
	def __init__(self, request, view=None, configsuffix="admin"):
		# 継承元処理
		super(MikanAdminViewApp, self).__init__(request, view=view, configsuffix=configsuffix)

# ------------------------------------------------------------
## Mikan ファイルビュー アプリケーション クラス
#
class MikanFileViewApp(MikanViewApp):

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	#  @param filename ファイル名
	def __init__(self, request, filename="", configsuffix=""):
		# 継承元処理
		super(MikanFileViewApp, self).__init__(request, MikanFileView(request, filename), configsuffix)

		# エンコード利用を無効に
		request.useencode = False

# ------------------------------------------------------------
## Main Section
# ------------------------------------------------------------
if __name__ == '__main__':
	pass

# ------------------------------------------------------------
